package com.cheng.example.book.advise151.chap3.client38;

import lombok.Data;

/**
 *
 * 建议38：使用静态内部类提高封装性
 *
 * 两大优点：
 * 加强了类的封装和提高了代码的可读性
 *
 *
 * 静态内部类和内部类的三个区别
 *
 * 1、静态内部类不持有外部类的引用：在普通内部类中，我们可以直接访问外部类的属性、方法，即使是private类型也可以访问，
 * 这是因为内部类持有一个外部类的引用，可以自由访问。而静态内部类，则只可以访问外部类的静态方法和静态属性(如果是private权限也能访问，这是由其代码位置决定的)，
 * 其它的则不能访问。
 *
 *
 * 2、静态内部类不依赖外部类：普通内部类与外部类之间是相互依赖关系，内部类实例不能脱离外部类实例，也就是说它们会同生共死，
 * 一起声明，一起被垃圾回收，而静态内部类是可以独立存在的，即使外部类消亡了，静态内部类也是可以存在的。
 *
 *
 * 3、普通内部类不能声明static的方法和变量：普通内部类不能声明static的方法和变量，注意这里说的是变量，
 * 常量(也就是final static 修饰的属性)还是可以的，而静态内部类形似外部类，没有任何限制。
 */


@Data
public class Person {
    // 姓名
    private String name;
    // 家庭
    private Home home;

    public Person(String _name) {
        name = _name;
    }

    /* home、name的setter和getter方法略 */

    @Data
    public static class Home {
        // 家庭地址
        private String address;
        // 家庭电话
        private String tel;

        public Home(String _address, String _tel) {
            address = _address;
            tel = _tel;
        }
        /* address、tel的setter和getter方法略 */
    }


    public static void main(String[] args) {
        // 定义张三这个人
        Person p = new Person("张三");
        // 设置张三的家庭信息
        p.setHome(new Home("北京", "010"));

    }
}